package com.rongkang.interview.juc.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;



/*
 * 可重入锁（也叫递归锁）
 * 指的是同一线程外层函数获取到锁之后，内层函数递归仍可以获取到该锁的代码，在同一线程外层获取该锁之后，进入内层方法自动获取该锁
 * */
public class RecursionDemo {
    public static void main(String[] args) {
        Phone phone = new Phone();
        new Thread(phone, "t3").start();
        new Thread(phone, "t4").start();
    }
}
class Phone implements Runnable {
    //可重入锁，默认是非公平锁，根据构造器来区分，true为公平锁
    Lock lock = new ReentrantLock();

    public void getLock() {
        lock.lock();
//        lock.lock();  //如果是两把锁，但是只释放了一把锁，线程就会卡在这里，编译会通过，但是运行会卡在这里
        try {
            System.out.println(Thread.currentThread().getName() + "\t getLock");
            setLock();
        } finally {
            //lock.unlock();//如果只加了一把锁，但是释放了两把锁，这样就会导致该线程拿取到不该获取到的资源，直接抛异常，编译通过
            lock.unlock();
        }
    }
    public void setLock() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t  *******setLock");
        } finally {
            lock.unlock();
        }
    }
    @Override
    public void run() {
        getLock();
    }
}




